package main

import (
	"fmt"
	"reflect"
)

//反射快速入门
//
func main() {
	test01(1)
	test02(Student{
		Name: "路飞",
		Age:  10,
	})
}

//获取入参的Value，kind type
func test01(val interface{}) {
	rVal := reflect.ValueOf(val)            //获取变量的Value
	fmt.Printf("reflect.Value %v \n", rVal) //1

	num := rVal.Int() + 10
	fmt.Println("内部针对值增加10：", num)

	rKind := rVal.Kind()                    //获取kind
	fmt.Printf("reflect.Kind %v \n", rKind) //int

	rType := rVal.Type()                    //获取Type
	fmt.Printf("reflect.Type %v \n", rType) //int
}

//获取入参的Value，kind type，并修改value
func test02(val interface{}) {
	rVal := reflect.ValueOf(val)            //获取变量的Value
	fmt.Printf("reflect.Value %v \n", rVal) //{路飞 10}

	//kind是种类，对于数值，就是其本身，比如int的type是int，kind还是int
	//但是对于结构体，kind就是struct，type是实际的类型
	rKind := rVal.Kind()                    //获取kind
	fmt.Printf("reflect.Kind %v \n", rKind) //struct

	rType := rVal.Type()                    //获取Type
	fmt.Printf("reflect.Type %v \n", rType) //main.Student
}

type Student struct {
	Name string
	Age  int32
}
